
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Nginx的upstream模块是如何工作的 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Nginx的upstream模块是如何工作的 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Nginx 的 `upstream` 模块的核心作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`upstream` 模块是 Nginx 中用于实现负载均衡的重要组件，它允许将客户端请求分发到多个后端服务器，从而提升系统的可扩展性和高可用性。</div>
          </div>
          <div class="card-source">来源: upstream模块概述</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Nginx `upstream` 模块支持哪些常见的负载均衡算法？请列举四种。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中提到的四种主要负载均衡算法是：轮询 (Round Robin)，这是默认算法；加权轮询 (Weighted Round Robin)；最少连接 (Least Connections)；以及 IP 哈希 (IP Hash)。</div>
          </div>
          <div class="card-source">来源: upstream模块概述 > 3. 负载均衡算法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">“IP 哈希” (IP Hash) 负载均衡算法的主要应用场景是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">“IP 哈希”算法根据客户端 IP 地址进行哈希计算，将来自同一客户端的请求固定分配给某一台特定的服务器。因此，它的主要应用场景是需要实现会话保持（Session Persistence）的情况。</div>
          </div>
          <div class="card-source">来源: 负载均衡算法 > 4. IP 哈希（IP Hash）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当后端服务器不可用时，Nginx 的 `upstream` 模块是如何实现故障转移的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当 `upstream` 模块检测到某台服务器不可用时（例如通过健康检查或请求失败），它会自动将新的请求转发到服务器组中其他健康的服务器上。这个过程无需人工干预，从而提高了系统的容错能力。</div>
          </div>
          <div class="card-source">来源: upstream模块概述 > 5. 故障转移</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">文档中介绍了哪两种健康检查机制？它们的工作原理有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档介绍了被动健康检查和主动健康检查。被动健康检查是根据服务器处理实际请求时的响应情况（如超时或错误）来判断其健康状态。而主动健康检查是 Nginx 定期主动向后端服务器发送预定义的健康检查请求来监控其状态。</div>
          </div>
          <div class="card-source">来源: 健康检查 > 2. 健康检查的工作原理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在 Nginx 的 `upstream` 配置中，`max_fails` 和 `fail_timeout` 两个指令如何协同工作以实现被动健康检查？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`max_fails` 指令设置了服务器允许失败的最大次数，而 `fail_timeout` 定义了统计这些失败次数的时间窗口。如果在 `fail_timeout` 指定的时间内，服务器的失败次数达到了 `max_fails` 的值，Nginx 就会将该服务器标记为故障状态。</div>
          </div>
          <div class="card-source">来源: 健康检查 > 3.1 配置被动健康检查</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">开源版本的 Nginx 是否原生支持主动健康检查功能？如果不支持，应如何实现？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">不支持。根据文档，Nginx 的开源版本并未原生支持主动健康检查功能。该功能通常需要通过安装第三方模块来实现，例如 `nginx_upstream_check_module` 或 `nginx-upstream-health-check` 模块。</div>
          </div>
          <div class="card-source">来源: 健康检查 > 2.2 主动健康检查</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在 `upstream` 配置块中，`backup` 指令的作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`backup` 指令用于将一个服务器配置为备用服务器。只有在服务器组中所有主服务器（非备用服务器）都发生故障时，这些被标记为 `backup` 的备用服务器才会开始接收请求。</div>
          </div>
          <div class="card-source">来源: 故障转移 > 2.2 配置备份服务器</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">如何在不重启 Nginx 服务的情况下，动态修改 `upstream` 的配置？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`upstream` 配置可以在运行时动态修改。通过向 Nginx 发送 `reload` 信号，可以重新加载配置文件，从而实现动态添加或移除后端服务器，整个过程无需重启服务，也不会中断现有连接。</div>
          </div>
          <div class="card-source">来源: upstream模块概述 > 7. 动态修改和热部署</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
